// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

#ifndef EIGEN_CXX11_THREADPOOL_THREAD_ENVIRONMENT_H
#define EIGEN_CXX11_THREADPOOL_THREAD_ENVIRONMENT_H

namespace Eigen {

struct StlThreadEnvironment
{
	struct Task
	{
		std::function<void()> f;
	};

	// EnvThread constructor must start the thread,
	// destructor must join the thread.
	class EnvThread
	{
	  public:
		EnvThread(std::function<void()> f)
			: thr_(std::move(f))
		{
		}
		~EnvThread() { thr_.join(); }
		// This function is called when the threadpool is cancelled.
		void OnCancel() {}

	  private:
		std::thread thr_;
	};

	EnvThread* CreateThread(std::function<void()> f) { return new EnvThread(std::move(f)); }
	Task CreateTask(std::function<void()> f) { return Task{ std::move(f) }; }
	void ExecuteTask(const Task& t) { t.f(); }
};

} // namespace Eigen

#endif // EIGEN_CXX11_THREADPOOL_THREAD_ENVIRONMENT_H
